﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using NUnit.Framework;
using Helpers;
using Capa_Dominio;
using Capa_Persistencia_NH;
using Capa_Persistencia_NH.Interface;
using Capa_Persistencia_NH.AccesoDatos;

namespace Capa_TestingProyects
{
    [TestFixture]
    public class Test_InstrumentoSala
    {
        private IInstrumentoSala adminInstrumento = null;
        int codigoGenerado = 0;

        [TestFixtureSetUp]
        public void PrepararPruebas()
        {
            adminInstrumento = new InstrumentosSalaDAO();
            //foreach (Reservacion reserva in adminReservacion.ListarTodos())
            //    adminReservacion.Eliminar(reserva);
            // 4. Creamos 2 reservas para tenerlos disponibles en las pruebas
            //adminReservacion.Crear(new Reservacion() { CodigoSala =1, CodigoCliente =1, FechaReservacion = DateTime.Now, TotalHoras = 20, Observacion="Reserva para el sabado a las 3pm.", Estado=true });
        }

        [Test]
        public void Test1_Crear()
        {
            Assert.IsNotNull(adminInstrumento);
            //se instancia a la entidad a crear

            InstrumentosSala objInstrumento = new InstrumentosSala();
            objInstrumento.CodigoInstrumento = 1;
            objInstrumento.CodigoSala = 1;
            objInstrumento.Estado = true;
            objInstrumento.Observacion = "prueba para Instrumento sala";
         

            //se declara la entidad que se retornara
            InstrumentosSala adicionalRetornado = null;
            //no aseguramos que no retorne una exepcion
            Assert.DoesNotThrow(delegate
            {
                adicionalRetornado = adminInstrumento.Crear(objInstrumento);
                codigoGenerado = adicionalRetornado.CodigoInstrumento;
            }, "Instrumento adicionado a sala");
            // Probamos que la entidad resultante no sea nula
            Assert.IsNotNull(adicionalRetornado);
            //verificamos que el codigo generado sera mayor que 0
            Assert.Greater(codigoGenerado, 0);
        }

        [Test]
        public void Test2_Modificar()
        {
            // 1. Clase a probar: ReservacionDAO
            Assert.IsNotNull(adminInstrumento);
            // 2. Declaramos e instanciamos la entidad de dominio
            InstrumentosSala objInstrumento = adminInstrumento.Obtener(codigoGenerado);
            objInstrumento.CodigoInstrumento = 3;
            objInstrumento.CodigoSala = 2;
            objInstrumento.Observacion = "modificar";
            objInstrumento.Estado = true;
            // 3. Declaramos la entidad que contendrá el resultado
            InstrumentosSala instrumentoModificado = null;
            // 4. Probamos que no ocurra error al ejecutar el método
            Assert.DoesNotThrow(delegate
            {
                // 5. Ejecutamos el método a probar
                instrumentoModificado = adminInstrumento.Modificar(objInstrumento);
            }, "InstrumentoSala modificado");
            // Probamos que la entidad resultante no sea nula
            Assert.IsNotNull(instrumentoModificado);
            // Probamos que el código generado sea mayor a 0
            Assert.AreEqual(instrumentoModificado.CodigoInstrumento, codigoGenerado);
            // Probamos que la observacion registrado es igual al solicitado con la entidad
            Assert.AreEqual(instrumentoModificado.CodigoAsignacion, objInstrumento.CodigoAsignacion);
        }


        [Test]
        public void Test3_Eliminar()
        {
            // 1. Clase a probar: ReservacionDAO
            Assert.IsNotNull(adminInstrumento);
            // 2. Definimos la entidad que contendrá el resultado
            InstrumentosSala instrumentoExistente = adminInstrumento.Obtener(codigoGenerado);
            // 3. Probamos que no ocurra error al ejecutar el método
            Assert.DoesNotThrow(delegate
            {
                // 5. Ejecutamos el método a probar
                adminInstrumento.Eliminar(instrumentoExistente);
            });
            // Probamos que la entidad ya no existe
            Assert.IsNull(adminInstrumento.Obtener(codigoGenerado));
        }

        [TestFixtureTearDown]
        public void TerminarPruebas()
        {
            NHibernateHelper.CerrarFabrica();
        }
    }
}
